﻿using System;
using System.Collections.Generic;
using System.ComponentModel;

namespace RiskMan.DataClass.Models.Plaza_II.FortsFutInfoRepl
{
    /// <summary>
    /// Таблица 35. Поля таблицы session - Информация о торговой сессии
    /// Таблица содержит информацию о расписании сессий.
    /// </summary>
    public class Session : INotifyPropertyChanged
    {
        #region private

        private long _replId;
        private long _replRev;
        private long _replAct;
        private int _sessId;
        private DateTime _begin;
        private DateTime _end;
        private int _state;
        private int _optSessId;
        private DateTime _interClBegin;
        private DateTime _interClEnd;
        private int _interClState;
        private int _eveOn;
        private DateTime _eveBegin;
        private DateTime _eveEnd;
        private int _monOn;
        private DateTime _monBegin;
        private DateTime _monEnd;
        private DateTime _posTransferBegin;
        private DateTime _posTransferEnd;

        #endregion

        #region public

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplId
        {
            get { return _replId; }
            set
            {
                if (_replId != value)
                {
                    _replId = value;
                    RaisePropertyChanged("ReplId");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplRev
        {
            get { return _replRev; }
            set
            {
                if (_replRev != value)
                {
                    _replRev = value;
                    RaisePropertyChanged("ReplRev");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplAct
        {
            get { return _replAct; }
            set
            {
                if (_replAct != value)
                {
                    _replAct = value;
                    RaisePropertyChanged("ReplAct");
                }
            }
        }


        /// <summary>
        /// Идентификатор торговой сессии
        /// </summary>
        public int SessId
        {
            get { return _sessId; }
            set
            {
                if (_sessId != value)
                {
                    _sessId = value;
                    RaisePropertyChanged("SessId");
                }
            }
        }

        /// <summary>
        /// Время начала
        /// </summary>
        public DateTime Begin
        {
            get { return _begin; }
            set
            {
                if (_begin != value)
                {
                    _begin = value;
                    RaisePropertyChanged("Begin");
                }
            }
        }

        /// <summary>
        /// Время окончания
        /// </summary>
        public DateTime End
        {
            get { return _end; }
            set
            {
                if (_end != value)
                {
                    _end = value;
                    RaisePropertyChanged("End");
                }
            }
        }

        /// <summary>
        /// Состояние сессии
        /// • Поле state может принимать следующие значения:
        ///0 Сессия назначена. Нельзя ставить заявки, но можно удалять.
        ///1 Сессия идет. Можно ставить и удалять заявки.
        ///2 Приостановка торгов по всем инструментам. Нельзя ставить заявки, но можно удалять.
        ///3 Сессия принудительно завершена. Нельзя ставить и удалять заявки.
        ///4 Сессия завершена по времени. Нельзя ставить и удалять заявки.
        /// </summary>
        public int State
        {
            get { return _state; }
            set
            {
                if (_state != value)
                {
                    _state = value;
                    RaisePropertyChanged("State");
                }
            }
        }

        /// <summary>
        /// Номер соответствующей опционной сессии
        /// </summary>
        public int OptSessId
        {
            get { return _optSessId; }
            set
            {
                if (_optSessId != value)
                {
                    _optSessId = value;
                    RaisePropertyChanged("OptSessId");
                }
            }
        }

        /// <summary>
        /// Время начала пром. клиринга
        /// Поле inter_cl_state выдается (по битово):
        /// 0x0 Неопределен. Можно ставить и удалять заявки.
        /// 0x01 Будущий на сегодня. Можно ставить и удалять заявки.
        ///0x02 Отменен. Можно ставить и удалять заявки.
        ///0x04 Текущий, т.е. идет, ничего нельзя. Нельзя ставить и удалять заявки.
        ///0x08 Текущий, т.е. идет (по времени), но фактически завершен и уже можно выкачиваться, снимать
        ///заявки. Нельзя ставить заявки, но можно удалять.
        ///0x10 Успешно завершен (в т.ч. и по времени). Можно ставить и удалять заявки.
        /// </summary>
        public DateTime InterClBegin
        {
            get { return _interClBegin; }
            set
            {
                if (_interClBegin != value)
                {
                    _interClBegin = value;
                    RaisePropertyChanged(" InterClBegin");
                }
            }
        }

        /// <summary>
        /// Время окончания пром. клиринга
        /// </summary>
        public DateTime InterClEnd
        {
            get { return _interClEnd; }
            set
            {
                if (_interClEnd != value)
                {
                    _interClEnd = value;
                    RaisePropertyChanged("InterClEnd");
                }
            }
        }

        /// <summary>
        /// Состояние пром. клиринга
        /// </summary>
        public int InterClState
        {
            get { return _interClState; }
            set
            {
                if (_interClState != value)
                {
                    _interClState = value;
                    RaisePropertyChanged("InterClState");
                }
            }
        }

        /// <summary>
        /// Признак того, что доп вечерняя сессия будет проводиться
        /// </summary>
        public int EveOn
        {
            get { return _eveOn; }
            set
            {
                if (_eveOn != value)
                {
                    _eveOn = value;
                    RaisePropertyChanged("EveOn");
                }
            }
        }

        /// <summary>
        /// Время начала доп. вечерней сессии
        /// </summary>
        public DateTime EveBegin
        {
            get { return _eveBegin; }
            set
            {
                if (_eveBegin != value)
                {
                    _eveBegin = value;
                    RaisePropertyChanged("EveBegin");
                }
            }
        }

        /// <summary>
        /// Время окончания доп. вечерней сессии
        /// </summary>
        public DateTime EveEnd
        {
            get { return _eveEnd; }
            set
            {
                if (_eveEnd != value)
                {
                    _eveEnd = value;
                    RaisePropertyChanged("EveEnd");
                }
            }
        }

        /// <summary>
        /// Признак того, что доп утренняя сессия будет проводиться
        /// </summary>
        public int MonOn
        {
            get { return _monOn; }
            set
            {
                if (_monOn != value)
                {
                    _monOn = value;
                    RaisePropertyChanged("MonOn");
                }
            }
        }

        /// <summary>
        /// Время начала доп. утренней сессии
        /// </summary>
        public DateTime MonBegin
        {
            get { return _monBegin; }
            set
            {
                if (_monBegin != value)
                {
                    _monBegin = value;
                    RaisePropertyChanged("MonBegin");
                }
            }
        }

        /// <summary>
        /// Время окончания доп. утренней сессии
        /// </summary>
        public DateTime MonEnd
        {
            get { return _monEnd; }
            set
            {
                if (_monEnd != value)
                {
                    _monEnd = value;
                    RaisePropertyChanged("MonEnd");
                }
            }
        }

        /// <summary>
        /// Начало интервала переноса позиций
        /// которого действует особый режим заключения сделок по инструменту с поставкой в текущий торговый
        /// день. Во время действия данного режима запрещены все заявки по указанному инструменту, за
        /// исключением адресных заявок внутри одной РФ.
        /// </summary>
        public DateTime PosTransferBegin
        {
            get { return _posTransferBegin; }
            set
            {
                if (_posTransferBegin != value)
                {
                    _posTransferBegin = value;
                    RaisePropertyChanged("PosTransferBegin");
                }
            }
        }

        /// <summary>
        /// Конец интервала переноса позиций
        /// </summary>
        public DateTime PosTransferEnd
        {
            get { return _posTransferEnd; }
            set
            {
                if (_posTransferEnd != value)
                {
                    _posTransferEnd = value;
                    RaisePropertyChanged("PosTransferEnd");
                }
            }
        }

        #endregion


        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion


        #region processing
        public static Session ParseSeesion(Dictionary<String, String> relation)
        {
            Session tmp = new Session();
            tmp.Parse(relation);
            return tmp;
        }

        public void Parse(Dictionary<String, String> relation)
        {
            foreach (String field in relation.Keys)
            {
                String value = relation[field];

                switch (field)
                {

                    case "replID": long.TryParse(value, out _replId); break;
                    case "replRev": long.TryParse(value, out _replRev); break;
                    case "replAct": long.TryParse(value, out _replAct); break;
                    case "sess_id": int.TryParse(value, out _sessId); break;
                    case "begin": DateTime.TryParse(value, out _begin); break;
                    case "end": DateTime.TryParse(value, out _end); break;
                    case "state": int.TryParse(value, out _state); break;
                    case "opt_sess_id": int.TryParse(value, out _optSessId); break;
                    case "inter_cl_begin": DateTime.TryParse(value, out _interClBegin); break;
                    case "inter_cl_end": DateTime.TryParse(value, out _interClEnd); break;
                    case "inter_cl_state": int.TryParse(value, out _interClState); break;
                    case "eve_on": int.TryParse(value, out _eveOn); break;
                    case "eve_begin": DateTime.TryParse(value, out _eveBegin); break;
                    case "eve_end": DateTime.TryParse(value, out _eveEnd); break;
                    case "mon_on": int.TryParse(value, out _monOn); break;
                    case "mon_begin": DateTime.TryParse(value, out _monBegin); break;
                    case "mon_end": DateTime.TryParse(value, out _monEnd); break;
                    case "pos_transfer_begin": DateTime.TryParse(value, out _posTransferBegin); break;
                    case "pos_transfer_end": DateTime.TryParse(value, out _posTransferEnd); break; 

                };
            }
        }

        public static void AddValueToObsColSession(Session inst)
        {
            MainWindow.StaticLevel._dataProvider.SeesionList.Add(inst);
        }
        #endregion
    }
}
